package com.example.work.check;

import com.example.work.euums.DeviceCategory;
import com.example.work.euums.ITResourceType;

import java.util.HashMap;
import java.util.Map;

/**
 * 资产类型代码解析器
 * 用于将Excel中的资产类型映射到对应的code值
 */
public class AssetTypeCodeResolver {
    
    // 缓存所有的类型代码映射
    private static final Map<String, String> TYPE_CODE_MAP = new HashMap<>();
    
    static {
        initializeTypeCodeMapping();
    }
    
    /**
     * 初始化类型代码映射
     */
    private static void initializeTypeCodeMapping() {
        // DeviceCategory 映射
        for (DeviceCategory category : DeviceCategory.values()) {
            TYPE_CODE_MAP.put(category.getCategoryPath(), category.getCode());
            TYPE_CODE_MAP.put(category.getName(), category.getCode());
        }
        
        // ITResourceType 映射
        for (ITResourceType resourceType : ITResourceType.values()) {
            TYPE_CODE_MAP.put(resourceType.getAbbreviation(), resourceType.getCode());
            TYPE_CODE_MAP.put(resourceType.getFullName(), resourceType.getCode());
        }
        
        // 添加Excel中可能出现的资产类型到code的映射
        // 根据AssetTypeEnum中定义的类型
        TYPE_CODE_MAP.put("数据库", "0702");
        TYPE_CODE_MAP.put("服务器", "0101");
        TYPE_CODE_MAP.put("Web", "0699");
        TYPE_CODE_MAP.put("中间件", "0703");
        TYPE_CODE_MAP.put("负载均衡", "0106");
        TYPE_CODE_MAP.put("其他应用软件", "0699");
        TYPE_CODE_MAP.put("其他", "0799");


        // 打印映射关系用于调试
        System.out.println("资产类型代码映射初始化完成，共" + TYPE_CODE_MAP.size() + "个映射关系");
    }
    
    /**
     * 根据资产类型名称获取对应的code值
     * @param assetTypeName 资产类型名称
     * @return 对应的code值，如果找不到返回null
     */
    public static String getCodeByTypeName(String assetTypeName) {
        if (assetTypeName == null || assetTypeName.trim().isEmpty()) {
            return null;
        }
        
        String code = TYPE_CODE_MAP.get(assetTypeName.trim());
        if (code == null) {
            System.out.println("警告：未找到资产类型 '" + assetTypeName + "' 对应的code值");
        }
        
        return code;
    }
    
    /**
     * 检查资产类型名称是否有效
     * @param assetTypeName 资产类型名称
     * @return 是否有效
     */
    public static boolean isValidAssetType(String assetTypeName) {
        return getCodeByTypeName(assetTypeName) != null;
    }
    
    /**
     * 获取所有支持的资产类型名称
     * @return 支持的资产类型名称集合
     */
    public static java.util.Set<String> getSupportedAssetTypes() {
        return TYPE_CODE_MAP.keySet();
    }
    
    /**
     * 打印所有支持的资产类型映射
     */
    public static void printAllMappings() {
        System.out.println("所有支持的资产类型映射：");
        TYPE_CODE_MAP.entrySet().stream()
                .sorted(Map.Entry.comparingByValue())
                .forEach(entry -> System.out.println(entry.getKey() + " -> " + entry.getValue()));
    }
    
    /**
     * 根据AssetTypeEnum获取对应的code值
     * @param assetType AssetTypeEnum枚举值
     * @return 对应的code值
     */
    public static String getCodeByAssetTypeEnum(AssetTypeEnum assetType) {
        if (assetType == null) {
            return null;
        }
        
        return getCodeByTypeName(assetType.getTypeName());
    }
}